{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "iris = pd.read_table('iris.txt', header=None, sep=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "def disEclud(vecA, vecB):\n",
    "    return np.sum(np.power((vecA-vecB), 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "def randCent(df, k):\n",
    "    n = df.shape[1]\n",
    "    data_min = df.iloc[:, :n-1].min()\n",
    "    data_max = df.iloc[:, :n-1].max()\n",
    "    data_cent = np.random.uniform(data_min, data_max, (k, n-1))\n",
    "    return data_cent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[6.71346417, 2.68736091, 4.41187428, 0.96087441],\n",
       "       [4.98011763, 4.14752561, 2.64377247, 2.09543921],\n",
       "       [7.3958072 , 3.92182946, 5.01338114, 1.30672224]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "randCent(iris, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "def kmeans(df, k, distMet=disEclud, creatCent=randCent):\n",
    "    m, n = df.shape\n",
    "    centroids = creatCent(df, k)\n",
    "    clusterAssment = np.zeros((m,3))\n",
    "    clusterAssment[:, 0] = np.inf\n",
    "    clusterAssment[:, 1:3] = -1\n",
    "\n",
    "    result_set = pd.concat([df, pd.DataFrame(clusterAssment)], axis=1, ignore_index=True)\n",
    "\n",
    "    clusterChanged = False\n",
    "\n",
    "    while clusterChanged:\n",
    "        clusterChanged = False\n",
    "\n",
    "        for i in range(m):\n",
    "            dist = distMet(df.iloc[:, :n-1].values, centroids)\n",
    "            result_set.iloc[i, n] = dist.min()\n",
    "            result_set.iloc[i, n+1] = np.where(dist == dist.min())[0]\n",
    "        \n",
    "        clusterChanged = not (result_set.iloc[:, -1] == result_set.iloc[:, -2]).all()\n",
    "\n",
    "        if clusterChanged:\n",
    "            cent_df = result_set.groupby(n+1).mean()\n",
    "            centroids = cent_df.iloc[:, :n-1].values()\n",
    "            result_set.iloc[:, -1] = result_set.iloc[:, -2]\n",
    "\n",
    "    return centroids, result_set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "testSet = pd.read_table('testSet.txt', header=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.658985</td>\n",
       "      <td>4.285136</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-3.453687</td>\n",
       "      <td>3.424321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.838138</td>\n",
       "      <td>-1.151539</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-5.379713</td>\n",
       "      <td>-3.362104</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.972564</td>\n",
       "      <td>2.924086</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75</th>\n",
       "      <td>-2.793241</td>\n",
       "      <td>-2.149706</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>2.884105</td>\n",
       "      <td>3.043438</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>-2.967647</td>\n",
       "      <td>2.848696</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>4.479332</td>\n",
       "      <td>-1.764772</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>-4.905566</td>\n",
       "      <td>-2.911070</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>80 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           0         1\n",
       "0   1.658985  4.285136\n",
       "1  -3.453687  3.424321\n",
       "2   4.838138 -1.151539\n",
       "3  -5.379713 -3.362104\n",
       "4   0.972564  2.924086\n",
       "..       ...       ...\n",
       "75 -2.793241 -2.149706\n",
       "76  2.884105  3.043438\n",
       "77 -2.967647  2.848696\n",
       "78  4.479332 -1.764772\n",
       "79 -4.905566 -2.911070\n",
       "\n",
       "[80 rows x 2 columns]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "testSet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros(testSet.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "label = pd.DataFrame(np.zeros(testSet.shape[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.658985</td>\n",
       "      <td>4.285136</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-3.453687</td>\n",
       "      <td>3.424321</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.838138</td>\n",
       "      <td>-1.151539</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-5.379713</td>\n",
       "      <td>-3.362104</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.972564</td>\n",
       "      <td>2.924086</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          0         1    2\n",
       "0  1.658985  4.285136  0.0\n",
       "1 -3.453687  3.424321  0.0\n",
       "2  4.838138 -1.151539  0.0\n",
       "3 -5.379713 -3.362104  0.0\n",
       "4  0.972564  2.924086  0.0"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_set = pd.concat([testSet, label], axis=1, ignore_index=True)\n",
    "test_set.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_cent, test_cluster = kmeans(test_set, 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x1943efbdb10>"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(test_cluster.iloc[:, 0],test_cluster.iloc[:, 1], c=test_cluster.iloc[:, -1])"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "2469a70536e4d2335a2ea8907942d0699c37342a371ac185bdb5b0aa6f073890"
  },
  "kernelspec": {
   "display_name": "Python 3.10.3 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.3"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
